--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / ToneGenerator.js
Displaying Raw • Download
meshchatx/src/frontend/js/ToneGenerator.js e5756d7ab065475a18acdcafc008a767fcff87e0 (e5756d7a) Text, 8.02 KB
Tff7b72export Tff7b72default Tff7b72class Te6edf3ToneGenerator Tb4b4b4{
Tff7b72constructorTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3audioCtx Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3timeoutId Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72= Tff7b72nullTb4b4b4; T8b949e// 'ringback', 'busy', or null
Tff7b72thisTb4b4b4.Te6edf3volume Tff7b72= T79c0ff0.1Tb4b4b4; T8b949e// Default volume (0.0 to 1.0 real gain)
Tb4b4b4}
Te6edf3setVolumeTb4b4b4(Te6edf3volumePercentTb4b4b4) Tb4b4b4{
T8b949e// volumePercent is 0-100
Tff7b72thisTb4b4b4.Te6edf3volume Tff7b72= Tb4b4b4(Te6edf3volumePercent Tff7b72/ T79c0ff100Tb4b4b4) Tff7b72* T79c0ff0.2Tb4b4b4; T8b949e// Cap at 0.2 real gain for safety
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3gainNodeTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3setTargetAtTimeTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3volumeTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4, T79c0ff0.1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3_initAudioContextTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3audioCtx Tff7b72= Tff7b72new Tb4b4b4(Tffa657windowTb4b4b4.Te6edf3AudioContext Tff7b72|| Tffa657windowTb4b4b4.Te6edf3webkitAudioContextTb4b4b4)Tb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Create a high-quality output chain
Tff7b72thisTb4b4b4.Te6edf3masterCompressor Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createDynamicsCompressorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterCompressorTb4b4b4.Te6edf3thresholdTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(Tff7b72-T79c0ff24Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterCompressorTb4b4b4.Te6edf3kneeTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff30Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterCompressorTb4b4b4.Te6edf3ratioTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff12Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterCompressorTb4b4b4.Te6edf3attackTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff0.003Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterCompressorTb4b4b4.Te6edf3releaseTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff0.25Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterFilter Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createBiquadFilterTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterFilterTb4b4b4.Te6edf3type Tff7b72= Ta5d6ff"lowpass"Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterFilterTb4b4b4.Te6edf3frequencyTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff4000Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterFilterTb4b4b4.Te6edf3QTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff0.7Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterCompressorTb4b4b4.Te6edf3connectTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3masterFilterTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3masterFilterTb4b4b4.Te6edf3connectTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3destinationTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3playRingbackTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72=== Ta5d6ff"ringback"Tb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_initAudioContextTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72= Ta5d6ff"ringback"Tb4b4b4;
Tff7b72const Te6edf3play Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3osc1 Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createOscillatorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3osc2 Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createOscillatorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3sub Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createOscillatorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3panner1 Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createStereoPannerTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3panner2 Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createStereoPannerTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3gain Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createGainTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3subGain Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createGainTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Main frequencies
Te6edf3osc1Tb4b4b4.Te6edf3type Tff7b72= Ta5d6ff"sine"Tb4b4b4;
Te6edf3osc1Tb4b4b4.Te6edf3frequencyTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff440Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3type Tff7b72= Ta5d6ff"sine"Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3frequencyTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff480Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
T8b949e// Sub layer for depth and "feel"
Te6edf3subTb4b4b4.Te6edf3type Tff7b72= Ta5d6ff"sine"Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3frequencyTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff40Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Te6edf3subGainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff0.05Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
T8b949e// Stereo separation for quality headphones
Te6edf3panner1Tb4b4b4.Te6edf3panTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(Tff7b72-T79c0ff0.4Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Te6edf3panner2Tb4b4b4.Te6edf3panTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff0.4Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Te6edf3osc1Tb4b4b4.Te6edf3connectTb4b4b4(Te6edf3panner1Tb4b4b4)Tb4b4b4;
Te6edf3panner1Tb4b4b4.Te6edf3connectTb4b4b4(Te6edf3gainTb4b4b4)Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3connectTb4b4b4(Te6edf3panner2Tb4b4b4)Tb4b4b4;
Te6edf3panner2Tb4b4b4.Te6edf3connectTb4b4b4(Te6edf3gainTb4b4b4)Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3connectTb4b4b4(Te6edf3subGainTb4b4b4)Tb4b4b4;
Te6edf3subGainTb4b4b4.Te6edf3connectTb4b4b4(Te6edf3gainTb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff0Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3linearRampToValueAtTimeTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3volumeTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTime Tff7b72+ T79c0ff0.1Tb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3connectTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3masterCompressorTb4b4b4)Tb4b4b4;
Te6edf3osc1Tb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72= Tb4b4b4[Te6edf3osc1Tb4b4b4, Te6edf3osc2Tb4b4b4, Te6edf3subTb4b4b4]Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72= Te6edf3gainTb4b4b4;
T8b949e// Stop after 2 seconds with a smooth fade-out
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4) Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3osc1Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3gainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3exponentialRampToValueAtTimeTb4b4b4(T79c0ff0.001Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTime Tff7b72+ T79c0ff0.5Tb4b4b4)Tb4b4b4;
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3osc1Tb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3osc1Tb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3osc2Tb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3subGainTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3panner1Tb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3panner2Tb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4, T79c0ff2000Tb4b4b4)Tb4b4b4;
T8b949e// Repeat every 6 seconds
Tff7b72thisTb4b4b4.Te6edf3timeoutId Tff7b72= Te6edf3setTimeoutTb4b4b4(Te6edf3playTb4b4b4, T79c0ff6000Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3playTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3playBusyToneTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72=== Ta5d6ff"busy"Tb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3_initAudioContextTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72= Ta5d6ff"busy"Tb4b4b4;
Tff7b72const Te6edf3play Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3osc Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createOscillatorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3sub Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createOscillatorTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3gain Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createGainTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3subGain Tff7b72= Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3createGainTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3oscTb4b4b4.Te6edf3type Tff7b72= Ta5d6ff"sine"Tb4b4b4;
Te6edf3oscTb4b4b4.Te6edf3frequencyTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff480Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3type Tff7b72= Ta5d6ff"sine"Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3frequencyTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff40Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Te6edf3subGainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff0.05Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Te6edf3oscTb4b4b4.Te6edf3connectTb4b4b4(Te6edf3gainTb4b4b4)Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3connectTb4b4b4(Te6edf3subGainTb4b4b4)Tb4b4b4;
Te6edf3subGainTb4b4b4.Te6edf3connectTb4b4b4(Te6edf3gainTb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3setValueAtTimeTb4b4b4(T79c0ff0Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTimeTb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3linearRampToValueAtTimeTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3volumeTb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTime Tff7b72+ T79c0ff0.05Tb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3connectTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3masterCompressorTb4b4b4)Tb4b4b4;
Te6edf3oscTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3startTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72= Tb4b4b4[Te6edf3oscTb4b4b4, Te6edf3subTb4b4b4]Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72= Te6edf3gainTb4b4b4;
T8b949e// Stop after 0.5 seconds with a short fade
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4) Tff7b72&& Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3oscTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3gainTb4b4b4.Te6edf3gainTb4b4b4.Te6edf3exponentialRampToValueAtTimeTb4b4b4(T79c0ff0.001Tb4b4b4, Tff7b72thisTb4b4b4.Te6edf3audioCtxTb4b4b4.Te6edf3currentTime Tff7b72+ T79c0ff0.1Tb4b4b4)Tb4b4b4;
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3oscTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3oscTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3subTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3subGainTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3gainTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, T79c0ff100Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4;
T8b949e// Repeat every 1 second
Tff7b72thisTb4b4b4.Te6edf3timeoutId Tff7b72= Te6edf3setTimeoutTb4b4b4(Te6edf3playTb4b4b4, T79c0ff1000Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3playTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// Auto-stop busy tone after 4 seconds (4 cycles)
Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72thisTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff4000Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3stopTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3currentTone Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3timeoutIdTb4b4b4) Tb4b4b4{
Te6edf3clearTimeoutTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3timeoutIdTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3timeoutId Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4.Te6edf3forEachTb4b4b4(Tb4b4b4(Te6edf3oscTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3oscTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if oscillator is already stopped or disconnected
Tb4b4b4}
Tff7b72try Tb4b4b4{
Te6edf3oscTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if oscillator is already disconnected
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4.Te6edf3stopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if oscillator is already stopped or disconnected
Tb4b4b4}
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3oscillatorTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if oscillator is already disconnected
Tb4b4b4}
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3oscillator Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3gainNodeTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3gainNodeTb4b4b4.Te6edf3disconnectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// Ignore errors if gain node is already disconnected
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3gainNode Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────